
/**
 * 说说var \ let \ const 之间的区别
 * 
 *  var 
 *    变量提升
 *    变量可以重复声明
 *    函数内部使用var声明变量，该变量是局部的
 *    函数内不使用var，该变量是全局的
 * 
 *  let
 *    不能变量提升
 *    变量不能重复声明
 *    块级作用域
 *   const 
 *    声明一个只读的常量，一旦声明，常量的值就不能改变
 *    不能重复声明 
 *    初始化就得赋值
 * 
 * 
 * 区别：
 *   变量提升
 *   暂时性死区
 *   块级作用域
 *   重复声明
 *   修改声明的变量
 *   使用
 * 
 * 能用const的情况尽量使用const, 其他情况下大多数使用let, 避免使用var
 * 
 */

// const a1 = [1, 2];
// const [...a2] = a1;

// console.log(a2);

// let c = 3;
// let d= 4;
// console.log(d,c);
//  [d,c] = [c,d];

//  console.log(d,c);


/**
 * 
 * is函数
 */
// function is(x, y){
//     return x===y ? x!=0 || y!=0 || 1/x == 1/y : x!=x && y!=y;
// }

// console.log(is(0,0))
  
// function shallowEqual(objA, objB) {

// }


// var fib = function(n) {
//     const MOD = 1000000007;
//     if (n <= 2) {
//         return n;
//     }
//     let p = 1, q = 1, r = 1;
//     for (let i = 3; i <= n; ++i) {
//         p = q; 
//         q = r; 
//         r = (p + q) % MOD;
//         console.log(r + '  ')
//     }
//     return r;
// };


// fib(5)

//  快速排序函数
// function quickSort(arr){
//     if (arr.length <= 1) {
//         return arr;
//     }
//     let pivotIndex = Math.floor(arr.length / 2);
//     let pivot = arr.splice(pivotIndex, 1)[0];
//     let left = [];
//     let right = [];
//     for (let i = 0; i < arr.length; ++i) {
//         if (arr[i] < pivot) {
//             left.push(arr[i]);
//         } else {
//             right.push(arr[i])
//         }
//     }
//     return quickSort(left).concat([pivot], quickSort(right));
// }


// 冒泡排序
// function bubbleSort(arr){
//     if (arr.length <= 1) {
//         return arr;
//     }
//     for (let i = 0; i < arr.length - 1; ++i) {
//         let flag = false;
//         for (let j = 0; j < arr.length - 1 - i; ++j) {
//             if (arr[j] > arr[j + 1]) {
//                 [arr[j], arr[j+1]] = [arr[j+1], arr[j]];
//                 flag = true;
//             }
//         }
//         if (!flag) break;
//     }
//     return arr;
// }

// function bubbleSort1(arr){
//      let i = arr.length-1;//初始时,最后位置保持不变  
//     while(i>0){
//      let pos = 0;//每趟开始时,无记录交换
//      for(let j = 0; j < i; j++){
//       if(arr[j] > arr[j+1]){
//            let tmp = arr[j];
//            arr[j] = arr[j+1];
//            arr[j+1] = tmp;
//             pos = j;//记录最后交换的位置  
//       }   
//      }
//      i = pos;//为下一趟排序作准备
//     }
//     return arr;
//    }


// 选择排序
// function selectionSort(arr){
//     if (arr.length <= 1) {
//         return arr;
//     }
//     for (let i = 0; i < arr.length - 1; ++i) {
//         let minIndex = i;
//         for (let j = i + 1; j < arr.length; ++j) {
//             if (arr[j] < arr[minIndex]) {
//                 minIndex = j;
//             }
//         }
//         [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
//     }
//     return arr;
// }

// let a = [9,4,6,5,1, 2, 3];
// console.log(a);
// console.log(`${selectionSort.name}:`+selectionSort(a));
// console.log(a);


// function roll(){
//     for(var i=0;i<=5;i++){
//         setTimeout(() => {
//             console.log(i)
//         }, 0);
//     }
// }

// roll()

// function validate(arr) {
//     let stack = [];
//     for (let i = 0; i < arr.length; ++i) {
//         if (arr[i] === '(' || arr[i] === '[') {
//             stack.push(arr[i]);
//         } else if (arr[i] === ')') {
//             let top = stack.pop();
//             if (top !== '(') return false;
//         } else if (arr[i] === ']') {
//             let top = stack.pop();
//             if (top !== '[') return false;
//         }
//     }
//     return stack.length === 0;
// }

// console.log(validate(['(', ')', '[', ']','(']));



// let obj = {
//     a: 1,
//     b: 2,
//     c: {
//         d: 3,
//         e: 4
//     },
//     f: null,
//     g: undefined,
//     h: /d{3}/g,
//     i: Symbol('d'),
//     j: new Date(),
//     k: new Map(),
//     l: new Set(),
//     m: function () {
//         console.log('hello');
//     },
// }
// console.log(obj)
// let obj2 = JSON.stringify(obj)
// console.log(JSON.parse(JSON.stringify(obj2)))

// let obj3 = Object.assign({}, obj)
// console.log(obj3)


// let obj4 = {...obj}
// console.log(obj4)


// 金额数字转大写
// function numToChinese(num) {
//     let cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; //汉字的数字
//     let cnIntRadice = ['', '拾', '佰', '仟']; //基本单位
//     let cnIntUnits = ['', '万', '亿', '兆']; //对应整数部分扩展单位
//     let cnDecUnits = ['角', '分', '毫', '厘']; //对应小数部分单位
//     let cnInteger = ['整']; //整数金额时后面跟的字符
//     let cnIntegerLast = '元'; //整数最后单位
//     let maxNum = 99999999999999.994; //最大处理的数字
//     let IntegerNum; //整数部分
//     let DecimalNum; //小数部分
//     let ChineseStr = ''; //输出的中文格式金额
//     let parts; //分离金额后用的数组，预定义
//     if (num < 0 || num > maxNum) {
//         return



// 金额按千分位分隔
// function formatThousand(num) {
//     num = (num || 0).toString()
//     let result = ''
//     while (num.length > 3) {
//         result = ',' + num.slice(-3) + result;
//         num = num.slice(0, num.length - 3);
//     }
//     if (num) { result = num + result; }
//     return result;
// }


// let str = '123456789.45'
// console.log(str)
// console.log(formatThousand(str))


// function coinChange(amount, coins) {  
//     // 首先对硬币进行降序排序，以便优先使用面额最大的硬币  
//     coins.sort((a, b) => b - a);  
//     let coinObj = {};  
//     let count = 0; // 记录硬币数量  
//     for (let coin of coins) {  
//         // 尝试使用当前硬币  
//         while (amount >= coin) {  
//             amount -= coin; // 使用一个当前硬币  
//             count++; // 硬币数量加一 
//             if (coin in coinObj) {  
//                 coinObj[coin]++;  
//             } else {  
//                 coinObj[coin] = 1;  
//             }
//         }  
//         // 如果金额已经被凑齐，则结束循环  
//         if (amount === 0) {  
//             break;  
//         }  
//     }  
//     console.log(coinObj);  
//     // 如果最终金额不为0，说明无法凑齐金额  
//     if (amount > 0) {  
//         return -1; // 或者抛出一个错误，根据实际情况决定  
//     }  
//     return count;  
// }  
  
// // 测试  
// console.log(coinChange(40, [1, 5, 10, 25])); 



// var permute = function(nums) {
//     const res = [], path = [];
//     backtracking(nums, nums.length, []);
//     return res;
    
//     function backtracking(n, k, used) {
//         if(path.length === k) {
//             res.push(Array.from(path));
//             return;
//         }
//         for (let i = 0; i < k; i++ ) {
//             if(used[i]) continue;
//             path.push(n[i]);
//             used[i] = true; // 同支
//             backtracking(n, k, used);
//             path.pop();
//             used[i] = false;
//         }
//     }
// };


// console.log(permute([1, 2, 3]));



// function solveNQueens(n) {  
//     let result = [];  
//     let board = new Array(n).fill(null).map(() => new Array(n).fill('.'));  
  
//     function isValid(row, col) {  
//         // 检查列  
//         for (let i = 0; i < row; i++) {  
//             if (board[i][col] === 'Q') {  
//                 return false;  
//             }  
//         }  
  
//         // 检查左上方对角线  
//         for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {  
//             if (board[i][j] === 'Q') {  
//                 return false;  
//             }  
//         }  
  
//         // 检查右上方对角线  
//         for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {  
//             if (board[i][j] === 'Q') {  
//                 return false;  
//             }  
//         }  
  
//         return true;  
//     }  
  
//     function placeQueens(row = 0) {  
//         if (row === n) {  
//             // 将棋盘转换为字符串并添加到结果中  
//             let solution = board.map(row => [...row]);  
//             result.push(solution);  
//             return;  
//         }  
  
//         for (let col = 0; col < n; col++) {  
//             if (isValid(row, col)) {  
//                 board[row][col] = 'Q'; // 放置皇后  
//                 placeQueens(row + 1); // 递归放置下一个皇后  
//                 board[row][col] = '.'; // 回溯，撤销皇后  
//             }  
//         }  
//     }  
  
//     placeQueens();  
//     return result;  
// }  
  
// // 使用示例  
// const solutions = solveNQueens(4);  
// console.log(solutions);


// let board = new Array(5).fill(null).map(() => new Array(5).fill('.'));  
// console.log(board);  

